AWS Step Functionsのネストされたステートマシン実行は同期と非同期で必要な権限が異なる
こんにちは。サービスグループの武田です。
AWS Step Functionsのステートマシンでは、タスク状態から異なるステートマシンを呼び出すことができます。これを ステートマシンのネスト と呼んでいます。
さてネストされたステートマシンを呼び出す方法として同期
と非同期
のオプションがあります。実は同期
呼び出しの場合、追加の権限が必要となるのですが、そのことを知らなかったためハマりました。まずはその手順を再現してみます。
ハマった手順
呼び出されるサブステートマシンと、それを呼び出すメインステートマシンを定義していきます。また呼び出し方法として非同期
呼び出しするステートマシンを作成します。
サブステートマシンの定義
呼び出されることになるステートマシンを作成します。名前はSubStateMachine
とし、ウィザードにしたがってIAMロールも新しく作成します。ステートマシンは10秒待つだけのシンプルなものです。
作成できました。
メインステートマシンの定義
SubStateMachine
を実行するステートマシンを作成します。名前はMainStateMachine
とし、こちらもIAMロールは新しく作成します。
作成できました。
試しに実行してみると、問題なく完了します。
同期呼び出しするように変更
さてここまでの手順は問題ありません。問題となるのはこの次です。先ほど作成したMainStateMachine
のステートマシン実行を同期
呼び出しに変更してみます。
具体的にはResourceにsync
を追加します。
"Resource": "arn:aws:states:::states:startExecution",
↓
"Resource": "arn:aws:states:::states:startExecution.sync",
変更できたら保存します。……が、できません!
原因と対策
先ほどのエラーですが、なぜエラーとなったのか原因が画面上からは分かりません。ドキュメントを読むなどして判明したのは、同期
呼び出しをするためには非同期
呼び出しの権限セットに、追加の権限が必要だということでした。詳細は参考リンクをご覧ください。
このエラーを出ないようにするためには2つの対策が考えられます。
- 新しいIAMロールを自動生成する
- 作成済みのロールに手動で権限を追加する
簡単なのは1で、ウィザード上でラジオボタンを変更して保存するだけです。
手動の場合は次の権限をStatement
に追加します。[[region]]
と[[accountId]]
は自身の環境に合わせて変更してください。
{ "Effect": "Allow", "Action": [ "states:DescribeExecution", "states:StopExecution" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:[[region]]:[[accountId]]:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule" ] }
まとめ
同期
呼び出しをする場合には非同期
呼び出しに追加の権限が必要でした。検証で試行錯誤する際に落とし穴となりそうですので覚えておくときっと役に立つでしょう。あとドキュメントはちゃんと読みましょうね。